package com.leyou.upload.service;

import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@Service
public class UploadService {

    /**
     * 1. 校验文件大小
     * 2. 校验文件的媒体类型
     * 3. 校验文件的内容
     *
     * @param file
     * @return
     */
    // 定义图片类型集合MIME格式类型
    private static final List<String> CONTENT_TYPES = Arrays.asList("image/jpeg", "image/gif", "image/png");

    // 定义后台日志输出的Logger对象
    private static final Logger LOGGER = LoggerFactory.getLogger(UploadService.class);

    // 定义fastDFST对象，来操作上传
    @Autowired
    private FastFileStorageClient storageClient;

    public String upload(MultipartFile file) {
        // 获取文件名称和类型
        String originalFilename = file.getOriginalFilename();
        String contentType = file.getContentType();
        // 校验文件类型
        // 如果文件类型不是CONTENT_TYPES里包含的类型返回null
        if (!CONTENT_TYPES.contains(contentType)) {
            // 自定义后台日志信息
            LOGGER.info("文件类型不合法:{}", originalFilename);
            return null;
        }

        try {
            // 校验文件内容
            BufferedImage read = null;
            read = ImageIO.read(file.getInputStream());

            if (read == null) {
                // 自动以后台日志信息
                LOGGER.info("文件内容不合法:{}", originalFilename);
                return null;
            }

            // 校验没问题把文件保存到服务器
            //file.transferTo(new File("C:\\leyou\\images\\" + originalFilename));
            // 生成url地址返回给前端
            //return "http://image.leyou.com/" + originalFilename;

            // 使用fastDFST来改造上传逻辑
            // 截取扩展名，如png  jpg这些
            String ext = StringUtils.substringAfterLast(originalFilename, ".");
            // 上传并保存图片(得到文件路径)，参数：1-上传的文件流 2-文件的大小 3-文件的后缀 4-可以不管他
            StorePath storePath = this.storageClient.uploadFile(file.getInputStream(), file.getSize(), ext, null);

            // 生成url地址+文件服务器路径返回。
            // image.leyou.com对应到linux上nginx的服务器,上面部署的fastDFST用来储存图片，这个路径就是图片在服务器上的地址。
            // http://image.leyou.com/group1/M00/00/00/wKgBtl2DaP-AQoNFAA7tyOTI4hM488.jpg
            return "http://image.leyou.com/" + storePath.getFullPath();

        } catch (IOException e) {
            LOGGER.info("系统内部错误:{}", originalFilename);
            e.printStackTrace();
        }
        return null;
    }
}
